#ifndef _TIR_H_
#define _TIR_H_

#include "Trajectoire.h"


/** @brief File brief description
 Le fichier Tir.h contient la declaration de toutes les fonctions et procedures
 necessaires à la gestion de n'importe lequel des tirs d'un niveau qu'il vienne
 du heros ou d'un des ennemis (creation, deplacement, destruction)
 */


/** @brief Un tir possede une taille (2 reels suivant X puis Y), une position
 * suivant X puis Y (2 réels) une trajectoire et un entier tir_ami qui vaut 0
 * si le tir provient du heros et 1 si c'est l'ennemi qui a tiré
 */
typedef struct
{
	float tailleX_tir;
	float tailleY_tir;
	float posX_tir;
	float posY_tir;
	Trajectoire* ptraj_tir;
	int tir_ami; /* 0 tir ami, 1 tir ennemi */
} Tir;


/** @brief Cette procedure initialise un tir en saisissant tous ses champs
 * @param [in,out] ptir
 * @param [in] tailleX
 * @param [in] tailleY
 * @param [in] posX
 * @param [in] posY
 * @param [in] ptraj //pointeur sur une trajectoire
 * @param [in] tami
 */
void initTir (Tir* ptir, const float tailleX, const float tailleY,
	const float posX, const float posY, Trajectoire* ptraj, const int tami);


/** @brief Cette fonction alloue dans le tas l'espace mémoire nécessaire pour
 * un tir et renvoie un pointeur vers ce tir
 * @param [in] tailleX
 * @param [in] tailleY
 * @param [in] posX
 * @param [in] posY
 * @param [in] ptraj pointeur sur une trajectoire
 * @param [in] tami
 */
Tir* creerTir (const float tailleX, const float tailleY, const float posX, 
	       const float posY, Trajectoire* ptraj, const int tami);


/** @brief Cette procedure libere l'espace memoire alloue pour la trajectoire
 * d'un tir
 * @param [in,out] ptir
 */
void libereTir (Tir* ptir);


/** @brief Cette procedure libere l'espace memoire alloue pour un tir
 * @param [in,out] pptir
 */
void detruireTir (Tir** pptir);


/** @brief Cette fonction renvoie la taille en x d'un tir
 * @param [in] ptir
 * @return ptir->tailleX_tir
 */
const float getTailleXTir (const Tir* ptir);


/** @brief Cette procedure permet de changer la taille en x d'un tir
 * @param [in,out] ptir
 * @param [in] tailleX
 */
void setTailleXTir (Tir* ptir, const float tailleX);


/** @brief Cette fonction renvoie la taille en y d'un tir
 * @param [in] ptir
 * @return ptir->tailleY_tir
 */
const float getTailleYTir (const Tir* ptir);


/** @brief Cette procedure permet de changer la taille en y d'un tir
 * @param [in,out] ptir
 * @param [in] tailleY
 */
void setTailleYTir (Tir* ptir, const float tailleY);


/** @brief Cette fonction renvoie la position en x d'un tir
 * @param [in] ptir
 * @return ptir->posX_tir
 */
const float getPosXTir (const Tir* ptir);


/** @brief Cette procedure permet de changer la position en x d'un tir
 * @param [in,out] ptir
 * @param [in] posX
 */
void setPosXTir (Tir* ptir, const float posX);


/** @brief Cette fonction renvoie la position en y d'un tir
 * @param [in] ptir
 * @return ptir->posY_tir
 */
const float getPosYTir (const Tir* ptir);


/** @brief Cette procedure permet de changer la position en y d'un tir
 * @param [in,out] ptir
 * @param [in] posY
 */
void setPosYTir  (Tir* ptir, const float posY);


/** @brief Cette fonction renvoie un pointeur sur la trajectoire d'un tir
 * @param [in] ptir
 * @return ptir->ptraj_tir
 */
Trajectoire* getTirTraj (const Tir* ptir);


/** @brief Cette procedure permet de changer le pointeur de la trajectoire d'un
 * tir
 * @param [in,out] ptir
 * @param [in] ptraj
 */
void setTirTraj (Tir* ptir, Trajectoire* ptraj);


/** @brief Cette fonction retourne un entier correspondant a la nature du tir :
 * 0 si c'est un tir normal venant du heros, 1 si c'est un tir ennemi, 2 si
 * c'est un missile et 3 si c'est une onde de choc
 * @param [in] ptir
 * @return ptir->tir_ami
 */

/** @brief Cette fonction renvoie le vitesse d'un tir
 * @param [in] ptir
 * @return ptir->ptraj_tir->vitesse
 */
const float getTirVitesse (const Tir* ptir);


/** @brief Cette fonction renvoie la direction de déplacement suivant l'axe des absisses d'un tir
 * @param [in] ptir
 * @return ptir->ptraj_tir->vectx
 */
const float getTirVectx (const Tir* ptir);


/** @brief Cette fonction renvoie la direction de déplacement suivant l'axe des ordonnées d'un tir
 * @param [in] ptir
 * @return ptir->ptraj_tir->vecty
 */
const float getTirVecty (const Tir* ptir);


const int getTirAmi (const Tir* ptir);

/** @brief Cette procedure permet de changer l'entier correspondant a la nature
 * du tir_ami
 * @param [in,out] ptir
 * @param [in] tami
 */
void setTirAmi (Tir* ptir, const int tami);


/** @brief Cette procedure permet de deplacer le tir en modifiant sa position
 * en fonction de sa trajectoire
 * @param [in,out] ptir
 */
void deplacerTir (Tir* ptir);

#endif
